/************************************
 * 删除服务器上指定的文件
 *
 * 成功返回1 失败返回-1
 ***********************************/

#include "../include/server.h"

int serverRm(int sockFd, char *fileName, int curDirID, int ownerID){
    //获取路径指向的文件的id
    char fileType;
    int fileID = 0;
    int res = 0;  //用来保存返回值
    int fileCnt = 0;
    char md5str[128] = {0};
    char flag;

    //1、获取要删除的文件的id、MD5码和type
    fileID = parsePath(fileName, curDirID, ownerID, md5str, &fileType);
    /* printf("fileID = %d, filetype = %c\n", fileID, fileType); */

    //2、判断文件类型，并进行相应的操作
    //  (1)文件类型，统计引用计数，
    //     0：路径错误； 1：可以删除文件了； >1：只删数据库里的记录
    if(fileType == 'f'){
        fileCnt = query_count(md5str);
        /* printf("fileCnt = %d\n", fileCnt); */
        if(0 == fileCnt){
            //非法路径
            flag = 'u';
            printf("illegal path!\n");
        }
        else if(1 == fileCnt){
            //引用计数为1时，删除记录之后，可以把实体也删除了
            res = deleteFile(fileID);
            res = remove(md5str);
            ERROR_CHECK(res, -1, "remove");
            flag = 'a';
            printf("rm %s\n", fileName);
        }
        else{
            //引用计数大于1，只删除数据库中的记录
            res = deleteFile(fileID);
            flag = 'a';
            printf("rm %s\n", fileName);
        }
    }
    
    //  (2)目录类型
    else if(fileType == 'd'){
        //只能删除空目录
        int childCnt = query_countChild(fileID);
        printf("childCnt = %d\n", childCnt);
        if(0 == childCnt){
            deleteFile(fileID);//删除记录
            flag = 'a';
        }
        else if(childCnt > 0){
            flag = 'e';
            printf("dir is not empty!\n");
        }
    }
    //向客户端发回执行结果
    send(sockFd, &flag, 1, 0);

    return res;
}
